package br.com.AC.modelo;
 
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

import br.com.AC.entidades.Consulta;
import br.com.AC.entidades.Convenio;
import br.com.AC.entidades.Convenio_has_Medico;
import br.com.AC.entidades.Dependente;
import br.com.AC.entidades.Imc;
import br.com.AC.entidades.Medico;
import br.com.AC.entidades.Paciente;
import br.com.AC.entidades.PacienteFull;
import br.com.AC.entidades.Usuario;

public class LoginModel {
	

	Paciente pac = new Paciente();
	Dependente dep = new Dependente();
	Imc imc = new Imc();
	Usuario usu = new Usuario();
	Medico med = new Medico();
    Convenio_has_Medico convM = new Convenio_has_Medico();

    public PacienteFull buscarUsuarioId (int idUsu) throws ClassNotFoundException, SQLException
    {
    	Class.forName("com.mysql.jdbc.Driver");
		String conexao = "jdbc:mysql://localhost:3306/tcc";
        Connection connection = (Connection) DriverManager.getConnection(conexao,"root","");
		String sql = "select * from Usuario usua " +
		"inner join Paciente paci on " +
		"usua.id_usuario = paci.Usuario_id_usuario " +
		"left join Dependente depe on " +
		"usua.id_usuario = Paciente_Usuario_id_usuario "+
			"WHERE id_usuario = ? "; 
		PreparedStatement preparedStatement = (PreparedStatement) connection.prepareStatement(sql);    
		preparedStatement.setInt(1, idUsu);  
		
		PacienteFull pacFull = new PacienteFull();
		
		ResultSet result = preparedStatement.executeQuery();   
		while(result.next())
        {
			//Paciente
			pacFull.setIdUsuario(result.getInt("id_usuario"));
			pacFull.setLogin(result.getString("login"));
			pacFull.setSenha(result.getString("senha"));
			pacFull.setNomeTitular(result.getString("nome"));
			pacFull.setCpfTitular(result.getString("cpf"));
			pacFull.setDtNascTitular(result.getDate("dt_nasc"));
			pacFull.setSexoTitular(result.getString("sexo"));
			pacFull.setEmail(result.getString("email"));
			pacFull.setTelefone(result.getString("telefone"));
			pacFull.setCelular(result.getString("celular"));
			pacFull.setEndereco(result.getString("endereco"));
			pacFull.setTpUsu(result.getString("tpUsu"));
			//dependente
			pacFull.setNomeDependente(result.getString("nome"));
			pacFull.setDtNascDependente(result.getDate("dt_nasc"));
			pacFull.setSexo(result.getString("sexo"));
			pacFull.setParentesco(result.getString("parentesco"));
			pacFull.setCpfDependente(result.getString("cpf"));
			//Paciente
			pacFull.setConvenio_idconvenio(result.getInt("Convenio_idconvenio"));
			
            System.out.println("Busca dos dados do Paciente para alterar realizada!");
        }
		connection.close();
        return pacFull;
    	
    }
    
    
	public String pesqCPF(String cpf, String tipo) {  
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");
		EntityManager em = emf.createEntityManager();
		 try {                 
			 Query query = em.createQuery("FROM Usuario WHERE cpf = :cpf AND tpUsu = :tipo");    
	         query.setParameter("cpf", cpf);              
	         query.setParameter("tipo", tipo);
	         Usuario result = (Usuario) query.getSingleResult();
	            
	         return "ok";
	            	
	        }   
	        catch (Exception e) {  
	            System.out.println("Erro:   "+e);  
	            return "fail";  
	        }   
	        finally {  
	        }  
	    }
	
	public String inlcuirPaciente(Object usuario, Object paciente, Object imcp) 
	{
		
		try{

			EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");

            EntityManager em = emf.createEntityManager();

            EntityTransaction tx = em.getTransaction();
			tx.begin();

			usu = (Usuario) usuario;
			
			em.persist(usu);

			tx.commit();
			
			Query query = em.createQuery("FROM Usuario WHERE cpf = :cpf AND tpUsu = :tipo");    
			query.setParameter("cpf", usu.getCpf());              
			query.setParameter("tipo", usu.getTpUsu());
			Usuario result = (Usuario) query.getSingleResult();

			tx.begin();

			pac = (Paciente) paciente;

			pac.setUsuario_id_usuario(result.getIdUsuario());
			
			em.persist(pac);

			imc = (Imc) imcp;

			imc.setPaciente_Usuario_id_usuario(result.getIdUsuario());

			em.persist(imc);
			
			tx.commit();
			
			em.close();
	}
	catch (Exception e) {
		return "fail";
	}	

	return"ok";
	}
	
	public String inlcuirPacienteDep(Object usuario, Object paciente, Object imcp, Object dependente) 
	{
		
		try{

			EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");

            EntityManager em = emf.createEntityManager();

            EntityTransaction tx = em.getTransaction();
			tx.begin();

			usu = (Usuario) usuario;

			em.persist(usu);

			tx.commit();
			
			Query query = em.createQuery("FROM Usuario WHERE cpf = :cpf AND tpUsu = :tipo");    
			query.setParameter("cpf", usu.getCpf());              
			query.setParameter("tipo", usu.getTpUsu());
			Usuario result = (Usuario) query.getSingleResult();

			tx.begin();

			pac = (Paciente) paciente;

			pac.setUsuario_id_usuario(result.getIdUsuario());
			
			em.persist(pac);

			imc = (Imc) imcp;

			imc.setPaciente_Usuario_id_usuario(result.getIdUsuario());

			em.persist(imc);
			
			dep = (Dependente) dependente;
			
			dep.setPaciente_Usuario_id_usuario(result.getIdUsuario());
			
			em.persist(dep);
			
			tx.commit();
			
			em.close();
	}
	catch (Exception e) {
		return "fail";
	}	

	return"ok";
	}
	
	public String incluirMedico(Object usuario, Object medico) 	
	{
		
		try{
			

			EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");

            EntityManager em = emf.createEntityManager();

            EntityTransaction tx = em.getTransaction();
			tx.begin();

			usu = (Usuario) usuario;

			em.persist(usu);
			
			tx.commit();
			
			Query query = em.createQuery("FROM Usuario WHERE cpf = :cpf AND tpUsu = :tipo");    
			query.setParameter("cpf", usu.getCpf());              
			query.setParameter("tipo", usu.getTpUsu());
			Usuario result = (Usuario) query.getSingleResult();

			tx.begin();

			med = (Medico) medico;
			
			med.setUsuario_id_usuario(result.getIdUsuario());
			
			em.persist(med);
	
			tx.commit();
			
			em.close();
	}
	catch (Exception e) {
		System.out.println(e);
		if(e.getMessage().contains("'login_UNIQUE'"))
		{
			return "loginDuplicate";
		}
		else
		{
			return "fail";
		}
	}	

	return"ok";
	}

	public String incConvenio(Object cm) 	
	{
		
		try{
			
			EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");

            EntityManager em = emf.createEntityManager();

            EntityTransaction tx = em.getTransaction();
			tx.begin();

			convM = (Convenio_has_Medico) cm;

			em.persist(convM);
			
			tx.commit();
			
			em.close();
	}
	catch (Exception e) {
		System.out.println(e);
		return "fail";
	}	
	return"ok";
	}


	public String alterarPaciente(Object usuario, Object paciente, Object imcp) 
	{
		
		try{

			EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");

            EntityManager em = emf.createEntityManager();

            EntityTransaction tx = em.getTransaction();
			tx.begin();

			usu = (Usuario) usuario;
			
			em.merge(usu);

			tx.commit();
			
			Query query = em.createQuery("FROM Usuario WHERE cpf = :cpf AND tpUsu = :tipo");    
			query.setParameter("cpf", usu.getCpf());              
			query.setParameter("tipo", usu.getTpUsu());
			Usuario result = (Usuario) query.getSingleResult();

			tx.begin();

			pac = (Paciente) paciente;

			pac.setUsuario_id_usuario(result.getIdUsuario());
			
			em.merge(pac);

			tx.commit();
			
			em.close();
	}
	catch (Exception e) {
		return "fail";
	}	

	return"ok";
	}
	
	public String alterarPacienteDep(Object usuario, Object paciente, Object imcp, Object dependente) 
	{
		
		try{

			EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");

            EntityManager em = emf.createEntityManager();

            EntityTransaction tx = em.getTransaction();
			tx.begin();

			usu = (Usuario) usuario;

			em.merge(usu);

			tx.commit();
			
			Query query = em.createQuery("FROM Usuario WHERE cpf = :cpf AND tpUsu = :tipo");    
			query.setParameter("cpf", usu.getCpf());              
			query.setParameter("tipo", usu.getTpUsu());
			Usuario result = (Usuario) query.getSingleResult();

			tx.begin();

			pac = (Paciente) paciente;

			pac.setUsuario_id_usuario(result.getIdUsuario());
			
			em.merge(pac);

			dep = (Dependente) dependente;
			
			dep.setPaciente_Usuario_id_usuario(result.getIdUsuario());
			
			em.merge(dep);
			
			tx.commit();
			
			em.close();
	}
	catch (Exception e) {
		return "fail";
	}	

	return"ok";
	}
	
	public String alterarMedico(Object usuario, Object medico) 	
	{
		
		try{
			

			EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");

            EntityManager em = emf.createEntityManager();

            EntityTransaction tx = em.getTransaction();
			tx.begin();

			usu = (Usuario) usuario;

			em.merge(usu);
			
			tx.commit();
			
			Query query = em.createQuery("FROM Usuario WHERE cpf = :cpf AND tpUsu = :tipo");    
			query.setParameter("cpf", usu.getCpf());              
			query.setParameter("tipo", usu.getTpUsu());
			Usuario result = (Usuario) query.getSingleResult();

			tx.begin();

			med = (Medico) medico;
			
			med.setUsuario_id_usuario(result.getIdUsuario());
			
			em.merge(med);
	
			tx.commit();
			
			em.close();
	}
	catch (Exception e) {
		System.out.println(e);
		{
			return "fail";
		}
	}	

	return"ok";
	}


	
	public String atualizaImc(Object imcp) 
	{
		
		try{
	
			EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");
	
	        EntityManager em = emf.createEntityManager();
	
	        EntityTransaction tx = em.getTransaction();
			tx.begin();
	
			imc = (Imc) imcp;
	
			em.persist(imc);
			
			tx.commit();
			
			em.close();
		}
		catch (Exception e) {
			return "fail";
		}	
	
	return"ok";
	}
	
	public Usuario cadastrado(String login) {  
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");
		EntityManager em = emf.createEntityManager();
		 try {                 
			 Query query = em.createQuery("FROM Usuario WHERE login = :login");    
			 query.setParameter("login", login);
			 Usuario result = (Usuario) query.getSingleResult();
	            
			 em.close();
			 
	         return result;
	            	
	        }   
	        catch (Exception e) {  
	            System.out.println("Erro:   "+e);  
	            return null;  
	        }   
	        finally {  
	        }  
	    }

	public Usuario cadastrado2(int idUsu) {  
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");
		EntityManager em = emf.createEntityManager();
		 try {                 
			 Query query = em.createQuery("FROM Usuario WHERE id_usuario = :idUsu");    
			 query.setParameter("idUsu", idUsu);
			 Usuario result = (Usuario) query.getSingleResult();
	            
			 em.close();
			 
	         return result;
	            	
	        }   
	        catch (Exception e) {  
	            System.out.println("Erro:   "+e);  
	            return null;  
	        }   
	        finally {  
	        }  
	    }

	public Consulta ultConsult(int idUsu) {  
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");
		EntityManager em = emf.createEntityManager();
		 try {                 
			 Query query = em.createQuery("FROM Consulta WHERE Paciente_Usuario_id_usuario = :idUsu" +
			 		" ORDER BY dt_consult DESC");    
			 query.setParameter("idUsu", idUsu);
			 Consulta result = (Consulta) query.getSingleResult();
	         
			 em.close();
			 
	         return result;
	            	
	        }   
	        catch (Exception e) {  
	            System.out.println("Erro:   "+e);  
	            return null;  
	        }   
	        finally {  
	        }  
	    }

	 public Medico procMedico(int idU)
		{  
			EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");
			EntityManager em = emf.createEntityManager();
			
			try {                 
				Query query = em.createQuery("FROM Medico WHERE Usuario_id_usuario = :idU ");    
				query.setParameter("idU", idU);              
				Medico result = (Medico) query.getSingleResult();
				
				em.close();
				
				return result;
			}   
			catch (Exception e) {  
				System.out.println("Erro:   "+e);  
				return null;  
			}   
			finally {  
			}  
		}
	
	public Paciente procPaciente(int idU)
	{  
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");
		EntityManager em = emf.createEntityManager();
		
		try {                 
			Query query = em.createQuery("FROM Paciente WHERE Usuario_id_usuario = :idU ");    
			query.setParameter("idU", idU);              
			Paciente result = (Paciente) query.getSingleResult();
			
			em.close();
			
			return result;
		}   
		catch (Exception e) {  
			System.out.println("Erro:   "+e);  
			return null;  
		}   
		finally {  
			em.close();  
		}  
	}
	
	public Dependente procDep(int idU)
	{  
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");
		EntityManager em = emf.createEntityManager();
		
		try {                 
			Query query = em.createQuery("FROM Dependente WHERE Paciente_Usuario_id_usuario = :idU ");    
			query.setParameter("idU", idU);              
			Dependente result = (Dependente) query.getSingleResult();
			
			em.close();
			
			return result;
		}   
		catch (Exception e) {  
			System.out.println("Erro:   "+e);  
			return null;  
		}   
		finally {  
			em.close();  
		}  
	}

	public Imc procImc(int idU)
	{  
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");
		EntityManager em = emf.createEntityManager();
		
		try {                 
			Query query = em.createQuery("FROM Imc WHERE Paciente_Usuario_id_usuario = :idU ");    
			query.setParameter("idU", idU);              
			Imc result = (Imc) query.getSingleResult();
			
			em.close();
			
			return result;
		}   
		catch (Exception e) {  
			System.out.println("Erro:   "+e);  
			return null;  
		}   
		finally {  
			em.close();  
		}  
	}
	
	
	public List<Medico> pesqMedico() {  
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");
		EntityManager em = emf.createEntityManager();
		 try {                 
			 Query query = em.createQuery("FROM Medico");    

			 List<Medico> result = (List<Medico>) query.getResultList();
	         
			 em.close();
			 
			 return result;
	            	
	        }   
	        catch (Exception e) {  
	            System.out.println("Erro:   "+e);  
	            return null;  
	        }   
	        finally {  
	        }  
	    }

	public List<Consulta> pesqConsulta(int crm, Date data) {  
		SimpleDateFormat formData = new SimpleDateFormat("yyyy-MM-dd");
		String x = formData.format(data);
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");
		EntityManager em = emf.createEntityManager();
		 try {                 

			 Query query = em.createQuery("FROM Consulta WHERE dt_consult = '"+x+"'"+
					                      " AND Medico_crm = "+crm+" ORDER BY hora");    
//			 query.setParameter("crm", crm);
			 List<Consulta> result = (List<Consulta>) query.getResultList();
	         
			 em.close();
			 
			 return result;
	            	
	        }   
	        catch (Exception e) {  
	            System.out.println("Erro:   "+e);  
	            return null;  
	        }   
	        finally {  
	        }  
	    }

	public List<Convenio_has_Medico> pesqConvMedico(int crm) {  
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("tcc");
		EntityManager em = emf.createEntityManager();
		 try {                 
			 Query query = em.createQuery("FROM Convenio_has_Medico WHERE medico_crm = :crm ");    
			 query.setParameter("crm", crm);
			 List<Convenio_has_Medico> result = (List<Convenio_has_Medico>) query.getResultList();
			 em.close();
			 return result;
	            	
	        }   
	        catch (Exception e) {  
	            System.out.println("Erro:   "+e);  
	            return null;  
	        }   
	        finally {  
	        }  
	    }


	
	
}
